package gui;

import javax.swing.JFrame;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JPanel;

import java.awt.FlowLayout;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.SwingWorker;

import control.Control;

import gui.beans.Menu;
import gui.eventos.TaskActionEvent;
import gui.eventos.TaskActionListener;
import gui.eventos.UpdateEvent;
import gui.eventos.UpdateListener;
import gui.iconos.Icono;

import javax.swing.JSplitPane;

import datos.Incidencia;
import datos.Proyecto;
import datos.Tarea;

import java.awt.BorderLayout;

@SuppressWarnings("serial")
public class InterfazGrafico extends JFrame {

	private Control control = null;

	private WCargador wcargador = null;
	
	private JPanel jContentPane = null;
	private JPanel panelIncidencias = null;
	private JPanel jPanelBotones = null;
	private PanelListaIncidencias panelListaIncidencias = null;
	private PanelDatosIncidencia panelDatos = null;
	private PanelTabs jTPContainer = null;
	private JSplitPane jSplitPane = null;
	private JButton jBSalir = null;
	private Menu menu = null;

	public InterfazGrafico(Control control) {
		super();
		this.control = control;

		wcargador = new WCargador(this);
		
		
		initialize();
		this.cargarTareas(this.control.getListaTareasOrdenada());
		this.setVisible(true);
		this.setIconImage(Icono.getImagenMain());
	}

	public void cargarTareas(List<Tarea> lista) {
		getPanelListaIncidencias().cargarLista(lista);
	}

	public void limpiarInterfaz() {
		control.setTareaActual(null);
		getPanelDatos().limpiarInterfaz();
		getJTPContainer().limpiarInterfaz();
	}

	public void cargarTarea(Tarea tarea) {
		control.setTareaActual(tarea);
		
		Cargador cargador = new Cargador(wcargador, this);
		cargador.setIncidencia(tarea);
		cargador.execute();
		wcargador.setVisible(true);
	}

	public void actualizaResumenHoras() {
		getPanelDatos().actualizaResumenHoras(control.getTareaActual().getControlHoras().getResumenHoras());
	}
	
	public void actualizaResumenProbadores(){
		getPanelDatos().actualizaResumenProbadores(control.getTareaActual().getResumenProbadores());
	}

	public void actualizaUILista() {
		getPanelListaIncidencias().actualizaUI();
	}

	/**
	 * This method initializes this
	 * 
	 */
	private void initialize() {
		this.setSize(new Dimension(1100, 650));
		this.centrarPantalla();

		this.setJMenuBar(getMenu());
		this.setTitle("Seguimiento de incidencias");
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			@Override
			public void windowClosing(java.awt.event.WindowEvent e) {
				control.ocultarGUI();
			}
		});
	}

	private void centrarPantalla() {
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

		int w = getSize().width;
		int h = getSize().height;
		int x = (dim.width - w) / 2;
		int y = (dim.height - h) / 2;

		setLocation(x, y);
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanelBotones(), BorderLayout.SOUTH);
			jContentPane.add(getJSplitPane(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes panelListaIncidencias
	 * 
	 * @return javax.swing.JPanel
	 */
	private PanelListaIncidencias getPanelListaIncidencias() {
		if (panelListaIncidencias == null) {
			panelListaIncidencias = new PanelListaIncidencias();
			panelListaIncidencias.addIncidenciaActionListener(new TaskActionListener() {
				public void actionPerformed(TaskActionEvent e) {
					Tarea tarea = null;
					switch (e.getAction()) {
					case TaskActionEvent.NUEVA_INCIDENCIA:
						String estado = (String) e.getValue();
						if (estado.equals("Tareas"))
							control.crearNuevaIncidencia();
						else
							control.crearNuevaIncidencia(estado);
						break;
						
					case TaskActionEvent.NUEVO_PROYECTO:
						estado = (String) e.getValue();
						if (estado.equals("Tareas"))
							control.crearNuevoProyecto();
						else
							control.crearNuevoProyecto(estado);
						break;

					case TaskActionEvent.ELIMINAR_INCIDENCIA:
						tarea = (Tarea) e.getValue();
						control.eliminarTarea(tarea);
						break;

					case TaskActionEvent.GENERAR_INFORME:
						tarea = (Tarea) e.getValue();
						control.generarInforme(tarea);
						break;

					case TaskActionEvent.TAREA_SELECCIONADA:
						tarea = (Tarea) e.getValue();
						control.setTareaActual(tarea);
						cargarTarea(tarea);
						break;
					
					case TaskActionEvent.CAMBIAR_ESTADO:
						tarea = (Tarea) e.getValue();
						estado = (String) e.getSecondaryValue();
						tarea.actualiza(Tarea.ESTADO, estado);
						actualizaUILista();
						control.guardar();
						break;
					}
				}
			});
		}
		return panelListaIncidencias;
	}

	/**
	 * This method initializes panelIncidencias
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getPanelIncidencias() {
		if (panelIncidencias == null) {
			panelIncidencias = new JPanel();
			panelIncidencias.setLayout(new BorderLayout());
			panelIncidencias.add(getPanelDatos(), BorderLayout.NORTH);
			panelIncidencias.add(getJTPContainer(), BorderLayout.CENTER);
		}
		return panelIncidencias;
	}

	PanelDatosIncidencia getPanelDatos() {
		if (panelDatos == null) {
			panelDatos = new PanelDatosIncidencia();
			panelDatos.addNumeroSeguimientoUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.NUMEROSEGUIMIENTO, e.getValue());
				}
			});
			panelDatos.addNombreUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.NOMBRE, e.getValue());
				}
			});
			panelDatos.addTiposActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.actualizaTareaActual(Incidencia.TIPO, (String) ((JComboBox) e.getSource()).getSelectedItem());
					panelDatos.setImputacionText(((Incidencia)control.getTareaActual()).getImputacion());
				}
			});
			panelDatos.addNoSiebelActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.actualizaTareaActual(Incidencia.SIEBEL, new Boolean(!((JCheckBox) e.getSource()).isSelected()));
				}
			});
			panelDatos.addHorasActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.imputacionHoras();
				}
			});
			panelDatos.addEstadoActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.actualizaTareaActual(Incidencia.ESTADO, ((JComboBox) e.getSource()).getSelectedItem());					
				}
			});
			panelDatos.addEquipoActionListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Proyecto.EQUIPO, e.getValue());
				}
			});
			panelDatos.addProbadoresActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.controlProbadores();
				}
			});
		}
		return panelDatos;
	}

	/**
	 * This method initializes jPanelBotones
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJPanelBotones() {
		if (jPanelBotones == null) {
			FlowLayout flowLayout = new FlowLayout();
			flowLayout.setHgap(10);
			jPanelBotones = new JPanel();
			jPanelBotones.setName("jPanelBotones");
			jPanelBotones.setLayout(flowLayout);
			jPanelBotones.add(getJBSalir(), null);
		}
		return jPanelBotones;
	}

	/**
	 * This method initializes jBSalir
	 * 
	 * @return javax.swing.JButton
	 */
	private JButton getJBSalir() {
		if (jBSalir == null) {
			jBSalir = new JButton();
			jBSalir.setText("Salir");
			jBSalir.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					control.salir();
				}
			});
		}
		return jBSalir;
	}

	/**
	 * This method initializes jSplitPane
	 * 
	 * @return javax.swing.JSplitPane
	 */
	private JSplitPane getJSplitPane() {
		if (jSplitPane == null) {
			jSplitPane = new JSplitPane();
			jSplitPane.setResizeWeight(0.5);
			jSplitPane.setLeftComponent(getPanelListaIncidencias());
			jSplitPane.setRightComponent(getPanelIncidencias());
		}
		return jSplitPane;
	}

	/**
	 * This method initializes jTPContainer
	 * 
	 * @return javax.swing.JTabbedPane
	 */
	PanelTabs getJTPContainer() {
		if (jTPContainer == null) {
			jTPContainer = new PanelTabs();

			jTPContainer.addComentariosUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.ENTRADAS, e.getValue());
				}
			});

			jTPContainer.addDescripcionUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.DESCRIPCION, e.getValue());
				}
			});

			jTPContainer.addSolucionUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.SOLUCION, e.getValue());
				}
			});
			jTPContainer.addNotasUpdateListener(new UpdateListener() {
				public void valueUpdated(UpdateEvent e) {
					control.actualizaTareaActual(Incidencia.NOTAS, e.getValue());
				}
			});

		}
		return jTPContainer;
	}

	private Menu getMenu() {
		if (menu == null)
			menu = new Menu(control);
		return menu;
	}
} // @jve:decl-index=0:visual-constraint="84,34"


@SuppressWarnings("unchecked")
class Cargador extends SwingWorker{

	private WCargador wcargador = null;
	private InterfazGrafico gui = null;
	
	private Tarea tarea = null;
	
	public Cargador(WCargador wcargador, InterfazGrafico gui){
		this.wcargador = wcargador;
		this.gui = gui;
	}
		
	public void setIncidencia(Tarea tarea){
		this.tarea = tarea;
	}
	
	@Override
	protected Object doInBackground() throws Exception {
		gui.getPanelDatos().cargarTarea(tarea);
		gui.getJTPContainer().cargarTarea(tarea);
		return null;
	}
	
	@Override
	protected void done(){
		wcargador.setVisible(false);
	}
}

@SuppressWarnings("serial")
class WCargador extends JDialog{
	
	public WCargador(InterfazGrafico gui){
		super((JFrame)gui, true);
		initialize((JFrame)gui);
	}
	
	private void initialize(JFrame frame){
		JPanel cp = new JPanel();
		cp.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		cp.setLayout(new FlowLayout());
		cp.add(new JLabel("Cargando ..."));
		this.setContentPane(cp);
		setSize(150,30);
		setUndecorated(true);
		setLocationRelativeTo(frame);
		
	}
}
